package com.cc.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.cc.bean.EnviarCorreoVO;
import com.cc.bean.EstadoVO;
import com.cc.bean.EstatusEmpresaVO;
import com.cc.bean.MunicipioVO;
import com.cc.bean.RolesVO;
import com.cc.bean.UsuarioVO;
import com.cc.db.ConnectionManager;
import com.cc.services.LoginService;
import com.cc.services.MailService;
import com.cc.utils.Cifrado;
import com.cc.utils.Constantes;

/**
 * Clase que gestiona el CRUD de un usuario en BD
 * 
 * @author jcorrea
 * 
 */
public class UsuarioDAO {


	/**
	 * Regresa al usuario con ese username y password. En caso de no existir
	 * regresa al VO con un mensaje de error.
	 * 
	 * @param usuario
	 * @param password
	 * @return
	 */
	public static UsuarioVO obtenerUsuario(String usuario, String password) {
		UsuarioVO vo = new UsuarioVO();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM usuario WHERE usuario = '"
					+ usuario + "' AND password = '" + Cifrado.cifrar(password)
					+ "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				vo.setId(resultSet.getInt("id"));
				vo.setUsuario(resultSet.getString("usuario"));
				vo.setIdLaborales(resultSet.getInt("id_datos_laborales"));
				vo.setEstatusUsr(resultSet.getString("estatus"));
				vo.setCorreoUsuario(resultSet.getString("correo_usuario"));
			}
			/* si no hubo resultado, entonces no existe el usuario */
			if (vo.getId() ==null || vo.getId() == 0) {
				vo.setError(true);
				vo.setMensajeError("err.login.userPassMal");
				if(resultSet!=null){
					try{
						resultSet.close();
						resultSet = null;
					}catch (Exception e) {}
				}
				if(statement!=null){
					try{
						statement.close();
						statement = null;
					}catch (Exception e) {}
				}
				if(connection!=null){
					try{
						connection.close();
						connection = null;
					}catch (Exception e) {}
				}
				return vo;
			}
			if (vo.getEstatusUsr() != null
					&& vo.getEstatusUsr().equalsIgnoreCase(
							Constantes.STAT_USER_INACTIVE)) {
				vo.setError(true);
				vo.setMensajeError("err.login.userPassMal");
				if(resultSet!=null){
					try{
						resultSet.close();
						resultSet = null;
					}catch (Exception e) {}
				}
				if(statement!=null){
					try{
						statement.close();
						statement = null;
					}catch (Exception e) {}
				}
				if(connection!=null){
					try{
						connection.close();
						connection = null;
					}catch (Exception e) {}
				}
				return vo;
			}
			/* si el usuario no tiene relacion con tbl_empresa, entonces regresa */
			if (vo.getId() == 0) {
				if(resultSet!=null){
					try{
						resultSet.close();
						resultSet = null;
					}catch (Exception e) {}
				}
				if(statement!=null){
					try{
						statement.close();
						statement = null;
					}catch (Exception e) {}
				}
				if(connection!=null){
					try{
						connection.close();
						connection = null;
					}catch (Exception e) {}
				}
				return vo;
			}
			
			query = "SELECT * FROM datos_laborales dl " +
					"WHERE dl.id = '" + vo.getIdLaborales() + "'";
			resultSet = statement.executeQuery(query);
			boolean esCliente = false;
			/* obtenemos el registro de la tabla tbl_empresa */
			while (resultSet.next()) {
				esCliente = true;
				vo = obtenerDatosUsuario(vo, resultSet);
				vo.setNomApellido(vo.getNombre() + " " + vo.getaPaterno());
			}
			
			/* Si no hubo registro en la tabla tbl_empresa */
			if (!esCliente) {
				vo.setIdLaborales(0);
				if(resultSet!=null){
					try{
						resultSet.close();
						resultSet = null;
					}catch (Exception e) {}
				}
				if(statement!=null){
					try{
						statement.close();
						statement = null;
					}catch (Exception e) {}
				}
				if(connection!=null){
					try{
						connection.close();
						connection = null;
					}catch (Exception e) {}
				}
				return vo;
			}
			
		} catch (Exception e) {
			vo.setError(true);
			vo
					.setMensajeError("err.login.servicioMal");
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return vo;
	}
	
	public static boolean existeUsuario(String usuario) {
		boolean existeUsuario= false;
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT id FROM usuario WHERE usuario = '"+ usuario + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				existeUsuario = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return existeUsuario;
	}
	
	/**
	 * Obtiene los datos de un usuario en base al id recibido.
	 * 
	 * @param idDatos
	 * @return
	 */
	public static UsuarioVO obtenerUsuarioPorId(Integer idDatos){
		UsuarioVO usuario = new UsuarioVO();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try{
			String query = "SELECT * FROM datos_laborales dl " +
			"WHERE dl.id = '" + idDatos + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			
			boolean esCliente = false;
			/* obtenemos el registro de la tabla tbl_empresa */
			while (resultSet.next()) {
				esCliente = true;
				usuario = obtenerDatosUsuario(usuario, resultSet);
				usuario.setNomApellido(usuario.getNombre() + " " + usuario.getaPaterno());
			}
			/* Si no hubo registro en la tabla tbl_empresa */
			if (!esCliente) {
				usuario.setId(0);
				if(resultSet!=null){
					try{
						resultSet.close();
						resultSet = null;
					}catch (Exception e) {}
				}
				if(statement!=null){
					try{
						statement.close();
						statement = null;
					}catch (Exception e) {}
				}
				if(connection!=null){
					try{
						connection.close();
						connection = null;
					}catch (Exception e) {}
				}
				return usuario;
			}
			
			return usuario;
		}catch (Exception e) {
			e.printStackTrace();
			return new UsuarioVO();
		}
		
	}
	
	public static List<UsuarioVO> buscarUsrRegistrados(UsuarioVO usr){
		List<UsuarioVO> usuarios = new ArrayList<UsuarioVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try{
			StringBuffer query = new StringBuffer("SELECT * FROM usuario usr, datos_laborales dl " +
					"WHERE dl.id = usr.id_datos_laborales ");
			
			if(usr.getId() != null && usr.getId() != 0){
				query.append("AND usr.id = '" + usr.getId() + "' ");
			}
			if(usr.getUsuario() != null && !"".equals(usr.getUsuario())){
				query.append("AND usr.usuario like '%" + usr.getUsuario() + "%' ");
			}
			if(usr.getNombre() != null && !"".equals(usr.getNombre())){
				query.append("AND dl.nombre like '%" + usr.getNombre() + "%' ");
			}
			if(usr.getaPaterno() != null && !"".equals(usr.getaPaterno())){
				query.append(" AND dl.apellido_paterno like '%" + usr.getaPaterno() + "%'");
			}
			if(usr.getaMaterno() != null && !"".equals(usr.getaMaterno())){
				query.append(" AND dl.apellido_materno like '%" + usr.getaMaterno() + "%'");
			}
			if(usr.getRfc() != null && !"".equals(usr.getRfc())){
				query.append("AND dl.rfc like '%" + usr.getRfc() + "%' ");
			}
			if(usr.getContacto1() != null && !"".equals(usr.getContacto1())){
				query.append("AND dl.contacto_1 like '%" + usr.getContacto1() + "%' ");
			}
			if(usr.getFechaInicio() != null && !"".equals(usr.getFechaInicio())){
				query.append(" AND dl.fecha_alta >= '" + usr.getFechaInicio() + "'");
			}
			if(usr.getFechaFin() != null && !"".equals(usr.getFechaFin())){
				query.append(" AND dl.fecha_alta <= '" + usr.getFechaFin() + "'");
			}
			if(usr.getEstatus() != null && usr.getEstatus() != 0){
				query.append(" AND dl.id_estatus = '" + usr.getEstatus() + "'");
			}
			if("eliminado".equals(usr.getEstatusUsr())){
				query.append(" AND usr.estatus != '-1'");
			}
			if(usr.getRol() != null && usr.getRol() != 0){
				query.append(" AND dl.id_rol = '" + usr.getRol() + "'");
			}
			if(usr.getContacto1() != null && !"".equals(usr.getContacto1())){
				query.append(" AND dl.contacto_1 like '%" + usr.getContacto1() + "%'");
			}
			System.out.println(query);
			
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query.toString());
			
			while (resultSet.next()) {
				UsuarioVO user = new UsuarioVO();
				user.setId(resultSet.getInt("usr.id"));
				user.setUsuario(resultSet.getString("usuario"));
				user.setEstatusUsr(resultSet.getString("estatus"));
				user.setCorreoUsuario(resultSet.getString("correo_usuario"));
				user = obtenerDatosUsuario(user, resultSet);
				user.setNomApellido(user.getNombre() + " " + user.getaPaterno());
				usuarios.add(user);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		
		return usuarios;
	}
	
	/**
	 * Recibe un objeto de tipo usuario para realizar una busqueda general, dependiendo de los parametros ingresados.
	 * 
	 * @param usuario
	 * @return
	 */
	public static List<UsuarioVO> buscarRegistros(UsuarioVO usuario){
		List<UsuarioVO> listaUsr = new ArrayList<UsuarioVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try{
			StringBuffer query = new StringBuffer("SELECT * FROM datos_laborales dl ");
			
			boolean banderaWhere = false;
			if(usuario.getNombre() != null && !"".equals(usuario.getNombre())){
				query.append(" WHERE dl.nombre like '%" + usuario.getNombre() + "%'");
				banderaWhere = true;
			}
			if(usuario.getRfc() != null && !"".equals(usuario.getRfc())){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.rfc like '%" + usuario.getRfc() + "%'");
			}
			if(usuario.getaPaterno() != null && !"".equals(usuario.getaPaterno())){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.apellido_paterno like '%" + usuario.getaPaterno() + "%'");
			}
			if(usuario.getaMaterno() != null && !"".equals(usuario.getaMaterno())){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.apellido_materno like '%" + usuario.getaMaterno() + "%'");
			}
			if(usuario.getFechaInicio() != null && !"".equals(usuario.getFechaInicio())){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.fecha_alta >= '" + usuario.getFechaInicio() + "'");
			}
			if(usuario.getFechaFin() != null && !"".equals(usuario.getFechaFin())){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.fecha_alta <= '" + usuario.getFechaFin() + "'");
			}
			if(usuario.getEstatus() != null && usuario.getEstatus() != 0){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.id_estatus = '" + usuario.getEstatus() + "'");
			}
			if(usuario.getRol() != null && usuario.getRol() != 0){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.id_rol = '" + usuario.getRol() + "'");
			}
			if(usuario.getContacto1() != null && !"".equals(usuario.getContacto1())){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.contacto_1 like '%" + usuario.getContacto1() + "%'");
			}
			if(usuario.getIdEstado() != null && usuario.getIdEstado() != 0){
				if(banderaWhere){
					query.append(" AND");
				}else{
					query.append(" WHERE");
					banderaWhere = true;
				}
				query.append(" dl.id_estado = " + usuario.getIdEstado());
			}
			
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query.toString());
			while (resultSet.next()) {
				UsuarioVO usr = new UsuarioVO();
				usr = obtenerDatosUsuario(usr, resultSet);
				usr.setNomApellido(usr.getNombre() + " " + usr.getaPaterno() + " " + usr.getaMaterno());
				listaUsr.add(usr);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return listaUsr;
	}
	
	/**
	 * Para invocar este metodo es necesario haber ejecutado el resulset global.
	 * 
	 * @param usr
	 * @return
	 */
	private static UsuarioVO obtenerDatosUsuario(UsuarioVO usr, ResultSet resultSet){
		
		try{
			usr.setIdLaborales(resultSet.getInt("dl.id"));
			usr.setEstatus(resultSet.getInt("id_estatus"));
			usr.setEstatusStr(obtenerEstatusEmpresa(usr.getEstatus()));
			usr.setFechaAlta(resultSet.getDate("fecha_alta"));
			usr.setNombre(resultSet.getString("nombre"));
			usr.setContacto1(resultSet.getString("contacto_1"));
			usr.setContacto2(resultSet.getString("contacto_2"));
			usr.setTelefono1(resultSet.getString("telefono_1"));
			usr.setTelefono2(resultSet.getString("telefono_2"));
			usr.setFax(resultSet.getString("fax"));
			usr.setCorreo(resultSet.getString("correo_1"));
			usr.setActividad(resultSet.getString("actividad"));
			usr.setRol(resultSet.getInt("id_rol"));
			usr.setPaginaWeb(resultSet.getString("pagina_web"));
			usr.setObservaciones(resultSet.getString("observaciones"));
			usr.setCorreo2(resultSet.getString("correo_2"));
			usr.setaPaterno(resultSet.getString("apellido_paterno"));
			usr.setaMaterno(resultSet.getString("apellido_materno"));
			usr.setRadio(resultSet.getString("radio"));
			if(usr.getaPaterno() == null){
				usr.setaPaterno("");
			}
			if(usr.getaMaterno() == null){
				usr.setaMaterno("");
			}
			//Datos fiscales
			usr.setIdEstado(resultSet.getInt("id_estado"));
			usr.setIdMunicipio(resultSet.getInt("id_municipio"));
			if (usr.getIdEstado() != 0) {
				usr.setEstado(obtenerEstado(usr.getIdEstado()));
			}
			if (usr.getIdMunicipio() != 0) {
				usr.setMunicipio(obtenerMunicipio(usr.getIdMunicipio()));
			}
			usr.setRfc(resultSet.getString("rfc"));
			usr.setDireccion(resultSet.getString("direccion"));
			usr.setColonia(resultSet.getString("colonia"));
			usr.setLocalidad(resultSet.getString("localidad"));
			usr.setCodigoPostal(resultSet.getString("codigo_postal"));
			usr.setNombreEntrega(resultSet.getString("nom_entrega"));
			usr.setNombrePagos(resultSet.getString("nom_pagos"));
			usr.setTelefonoEntrega(resultSet.getString("tel_entrega"));
			usr.setTelefonoPagos(resultSet.getString("tel_pagos"));
			usr.setCorreoEntrega(resultSet.getString("correo_entrega"));
			usr.setCorreoPagos(resultSet.getString("correo_pagos"));
			usr.setPais(resultSet.getString("pais"));
			usr.setExtTel1(resultSet.getString("ext_tel_1"));
			usr.setExtTel2(resultSet.getString("ext_tel_2"));
			return usr;
			
		}catch (Exception e) {
			e.printStackTrace();
			return new UsuarioVO();
		}
		
		
	}
	
	
	/**
	 * Al crear un tipo de usuario inserta sus datos en las tabals correspondientes
	 * 
	 * @param usuario
	 * @return
	 */
	public static Boolean insertDatosUsr(UsuarioVO usuario){
		Connection connection = null;
		Statement statement = null;
		try{
			String query = "";
			
			if(usuario.getIdLaborales() != null && usuario.getIdLaborales() != 0){
				query = "UPDATE datos_laborales SET nombre = " + val(usuario.getNombre()) + ", apellido_paterno = " + val(usuario.getaPaterno()) 
					+ ", apellido_materno = " + val(usuario.getaMaterno()) + ", id_estatus = " + val(usuario.getEstatus())
					+ ", id_rol = " + val(usuario.getRol()) + ", rfc = " + val(usuario.getRfc()) + ", fax = " + val(usuario.getFax()) 
					+ ", contacto_1 = "	+ val(usuario.getContacto1()) + ", telefono_1 = " + val(usuario.getTelefono1()) 
					+ ", correo_1 = " + valMin(usuario.getCorreo())  
					+ ", contacto_2 = " + val(usuario.getContacto2()) + ", telefono_2 = " + val(usuario.getTelefono2()) 
					+ ", correo_2 = " + val(usuario.getCorreo2())
					+ ", actividad = " + val(usuario.getActividad()) + ", pagina_web = " + valMin(usuario.getPaginaWeb()) 
					+ ", observaciones = " + val(usuario.getObservaciones()) + ", direccion = " + val(usuario.getDireccion())
					+ ", colonia = " + val(usuario.getColonia()) + ", localidad = " + val(usuario.getLocalidad())
					+ ", id_estado = " + val(usuario.getIdEstado()) + ", id_municipio = " + val(usuario.getIdMunicipio())
					+ ", codigo_postal = " + val(usuario.getCodigoPostal()) + ", nom_entrega = " + val(usuario.getNombreEntrega())
					+ ", tel_entrega = " + val(usuario.getTelefonoEntrega()) + ", correo_entrega = " + valMin(usuario.getCorreoEntrega())
					+ ", nom_pagos = " + val(usuario.getNombrePagos()) + ", tel_pagos = " + val(usuario.getTelefonoPagos())
					+ ", correo_pagos = " + val(usuario.getCorreoPagos()) + ", radio = " + val(usuario.getRadio()) + ", pais = " + val(usuario.getPais())
					+ ", ext_tel_1 = " + val(usuario.getExtTel1()) + ", ext_tel_2 = " + val(usuario.getExtTel2())
					+ " WHERE id = " + val(usuario.getIdLaborales());
				
			}else{
				query = "INSERT INTO datos_laborales VALUES(null, " + val(usuario.getNombre()) + "," 
					+ val(usuario.getaPaterno()) + "," + val(usuario.getaMaterno()) + "," + val(usuario.getEstatus()) + ","
					+ val(usuario.getRol()) + ", " + val(usuario.getRfc()) + ", '"
					+ new Date(usuario.getFechaAlta().getTime()) + "'," + val(usuario.getFax()) + ", "
					+ val(usuario.getContacto1()) + ", " + val(usuario.getTelefono1()) + ", " + valMin(usuario.getCorreo()) + ", "
					+ val(usuario.getContacto2()) + ", " + valMin(usuario.getCorreo2()) + ", " + val(usuario.getTelefono2()) + ", "
					+ val(usuario.getActividad()) + ", " + valMin(usuario.getPaginaWeb()) + "," + val(usuario.getObservaciones()) + ", "  
					+ val(usuario.getDireccion()) + ", " + val(usuario.getColonia()) + ", " + val(usuario.getLocalidad()) + ", " 
					+ val(usuario.getIdEstado()) + ", " + val(usuario.getIdMunicipio()) + ", " + val(usuario.getCodigoPostal()) + ", " 
					+ val(usuario.getNombreEntrega()) + ", " + val(usuario.getTelefonoEntrega()) + ", " + valMin(usuario.getCorreoEntrega()) + "," 
					+ val(usuario.getNombrePagos()) + ", " + val(usuario.getTelefonoPagos()) + ", " + valMin(usuario.getCorreoPagos()) + ", "
					+ val(usuario.getRadio()) + ", " + val(usuario.getPais()) + ", " + val(usuario.getExtTel1()) + ", " + val(usuario.getExtTel2()) + ")";
			}
			System.out.println(query);
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			statement.executeUpdate(query);
		}catch (Exception e) {
			e.printStackTrace();
			return false;
		}finally{
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		
		return true;
	}

	/**
	 * Obtiene el nombre de un municipio
	 * 
	 * @param idMunicipio
	 * @return
	 */
	public static String obtenerMunicipio(int idMunicipio) {
		String municipio = "";
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_municipios "
					+ "WHERE id_municipios = '" + idMunicipio + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla tbl_municipios */
			while (resultSet.next()) {
				municipio = resultSet.getString("nom_municipio");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return municipio;
	}

	/**
	 * Obtiene el nombre de un estado
	 * 
	 * @param idMunicipio
	 * @return
	 */
	public static String obtenerEstado(int idEstado) {
		String estado = "";
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_estados "
					+ "WHERE id_estado = '" + idEstado + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla tbl_municipios */
			while (resultSet.next()) {
				estado = resultSet.getString("nom_estado");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return estado;
	}
	
	/**
	 * Obtiene el estatus de la empresa
	 * 
	 * @param idMunicipio
	 * @return
	 */
	public static String obtenerEstatusEmpresa(int idEstatus) {
		String estatus = "";
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_estatus "
					+ "WHERE cod_status = '" + idEstatus + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla tbl_estatus_empresa */
			while (resultSet.next()) {
				estatus = resultSet.getString("status");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return estatus;
	}

	/**
	 * Inserta un usuario en la tabla usuario con estatus nuevo
	 * 
	 * @param vo
	 */
	public static Boolean insertarUsuarioNuevo(UsuarioVO usuario) {
		boolean insercionExitosa = false;
		Connection connection = null;
		Statement statement = null;
		try {
			String pass = LoginService.generarPassword();
			String password = Cifrado.cifrar(pass);
			String query = "insert into usuario values(null, " + val(usuario.getUsuario()) + " , "
			+ val(password) + ", " + val("NEW") + " , " + val(usuario.getIdLaborales()) + ", " 
			+ val(usuario.getCorreoUsuario()) + ")";
			
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			statement.executeUpdate(query);
			List<Object> params = new ArrayList<Object>();
			params.add(usuario.getUsuario().toUpperCase());
			params.add(pass);
			MailService mail = new MailService(usuario.getCorreo(), 3, params);
			mail.run();
			//Se envia correo de registro a usuario, si existe el correo.
			if(usuario.getCorreoUsuario() != null && !"".equals(usuario.getCorreoUsuario())
					&& !usuario.getCorreoUsuario().equals(usuario.getCorreo())){
				mail = new MailService(usuario.getCorreoUsuario(), 3, params);
				mail.run();
			}
			insercionExitosa=true;
		} catch (Exception e) {
			e.printStackTrace();
			insercionExitosa=false;
		}finally{
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return insercionExitosa;
	}

	/**
	 * Actualiza los valores de la tabla usuario. En caso de actualizar el
	 * password se debe proporcionar el mismo sin cifrado
	 * 
	 * @param vo
	 */
	public static Boolean actualizarUsuario(UsuarioVO vo) {
		boolean usuarioActualizado =false;
		Connection connection = null;
		Statement statement = null;
		try {
			String pass = "";
			if (vo.getPassword() != null) {
				pass = vo.getPassword();
				vo.setPassword(Cifrado.cifrar(vo.getPassword()));
			}
			String query = "UPDATE usuario SET usuario = "
					+ val(vo.getUsuario()) + ", password=" + val(vo.getPassword()) + ", "
					+ "id_datos_laborales=" + vo.getIdLaborales() + ", estatus="
					+ val(vo.getEstatusUsr()) + ", correo_usuario=" + val(vo.getCorreoUsuario()) 
					+ " " + "WHERE id = " + vo.getId();
			connection= ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			statement.executeUpdate(query);
			if(vo.getPassword() != null){
				//ENVIO DE CORREO EN REGISTRO USUARIO
				List<Object> params = new ArrayList<Object>();
				params.add(vo.getUsuario().toUpperCase());
				params.add(pass);
				//Verificar si el usuario tiene correo valido, si no enviar al cliente.
				String correo = null;
				if(vo.getCorreoUsuario() != null && !"".equals(vo.getCorreoUsuario())){
					correo = vo.getCorreoUsuario();
				}else{
					correo = vo.getCorreo();
				}
				MailService mail = new MailService(correo, 4, params);
				mail.run();
			}
			usuarioActualizado=true;

		} catch (Exception e) {
			e.printStackTrace();
			usuarioActualizado=false;
		}finally{
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return usuarioActualizado;
	}

	/**
	 * Borrado del usuario en base a su ID
	 * 
	 * @param vo
	 */
	public static void borrarUsuario(UsuarioVO vo) {
		Connection connection = null;
		Statement statement = null;
		try {
			if (vo.getId() == 0) {
				return;
			}
			String query = "DELETE FROM usuario WHERE id = " + vo.getId();
			connection= ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			statement.executeUpdate(query);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
	}

	/**
	 * Formatea el string para agregarlo al query. Contempla los tipos string e
	 * Integer
	 * 
	 * @param campo
	 * @return
	 */
	public static String val(Object campo) {
		if (campo instanceof String) {
			String campoStr = (String) campo;
			if (campoStr == null || campoStr.trim().equals("")) {
				return "null";
			} else {
				return "'" + campoStr.toUpperCase() + "'";
			}
		}

		if (campo instanceof Integer) {
			Integer campoInt = (Integer) campo;
			if (campoInt == null || campoInt.intValue() == 0) {
				return "0";
			} else {
				return campoInt.toString();
			}
		} else {
			return "''";
		}
	}
	
	/**
	 * Formatea el objeto para agregarlo al query en minusculas.
	 * 
	 * @param campo
	 * @return
	 */
	private static String valMin(Object campo){
		if (campo instanceof String) {
			String campoStr = (String) campo;
			if (campoStr == null || campoStr.trim().equals("")) {
				return "null";
			} else {
				return "'" + campoStr.toLowerCase() + "'";
			}
		}
		
		return null;
	}

	/**
	 * Obtiene todos los estados registrados en BD en formato de hashmap
	 * 
	 * @return
	 */
	public static Map<Integer, String> catalogoEstados() {
		Map<Integer, String> estados = new HashMap<Integer, String>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_estados";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				int idEstado = resultSet.getInt("id_estado");
				String nombreEstado = resultSet.getString("nom_estado");
				estados.put(idEstado, nombreEstado);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return estados;
	}
	
	/**
	 * Obtiene todos los estados registrados en BD en EstadosVO
	 * 
	 * @return
	 */
	public static ArrayList<EstadoVO> catalogoEstadosVO() {
		ArrayList<EstadoVO> estados = new ArrayList<EstadoVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_estados";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				int idEstado = resultSet.getInt("id_estado");
				String nombreEstado = resultSet.getString("nom_estado");
				EstadoVO estadoVO = new EstadoVO();
				estadoVO.setId(idEstado);
				estadoVO.setNombre(nombreEstado);
				estados.add(estadoVO);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return estados;
	}

	/**
	 * Obtiene los municipios registrados en BD en hasmap de un estado
	 * 
	 * @param nombreEstado
	 * @return
	 */
	public static Map<Integer, String> catalogoMunicipios(String nombreEstado) {
		Map<Integer, String> municipios = new HashMap<Integer, String>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_municipios WHERE nom_estado='"
					+ nombreEstado + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				int idMunicipio = resultSet.getInt("id_municipios");
				String nombreMunicipio = resultSet.getString("nom_municipio");
				municipios.put(idMunicipio, nombreMunicipio);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return municipios;
	}
	
	/**
	 * Obtiene los municipios registrados en BD en MunicipiosVO
	 * 
	 * @param nombreEstado
	 * @return
	 */
	public static ArrayList<MunicipioVO> catalogoMunicipiosVO(String nombreEstado) {
		ArrayList<MunicipioVO> municipios = new ArrayList<MunicipioVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_municipios WHERE id_estado='"
					+ nombreEstado + "'";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				int idMunicipio = resultSet.getInt("id_municipios");
				String nombreMunicipio = resultSet.getString("nom_municipio");
				MunicipioVO municipioVO = new MunicipioVO();
				municipioVO.setId(idMunicipio);
				municipioVO.setNombre(nombreMunicipio);
				municipios.add(municipioVO);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return municipios;
	}
	
	/**
	 * Obtiene todos estados en que se puede guardar a un cliente
	 * 
	 * @return
	 */
	public static ArrayList<EstatusEmpresaVO> catalogoEstatusEmpresaVO() {
		ArrayList<EstatusEmpresaVO> estatusEmpresa = new ArrayList<EstatusEmpresaVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_estatus";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				Integer idEstatus = resultSet.getInt("cod_status");
				String estatus = resultSet.getString("status");
				String identificador = resultSet.getString("id_status");
				if("CLIENTE".equals(identificador)){ //Llena la lista de estatus cliente
					EstatusEmpresaVO estatusEmpresaVO = new EstatusEmpresaVO();
					estatusEmpresaVO.setId(idEstatus);
					estatusEmpresaVO.setStatus(estatus);
					estatusEmpresaVO.setIdentificador(identificador);
					estatusEmpresa.add(estatusEmpresaVO);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return estatusEmpresa;
	}
	
	/**
	 * Metodo que se encarga de obtener de la base de datos los roles de los usuarios.
	 * @return
	 */
	public static List<RolesVO> ObtenerCatalogoRoles(){
		List<RolesVO> listaRoles = new ArrayList<RolesVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			String query = "SELECT * FROM cat_roles";
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			while (resultSet.next()) {
				RolesVO roles = new RolesVO();
				roles.setId(resultSet.getInt("id"));
				roles.setNombreRol(resultSet.getString("nombre"));
				listaRoles.add(roles);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return listaRoles;
	}
	
	/**
	 * Regresa un String con el nombre del rol para los forwards, dependiendo del tipo de usuario.
	 * 
	 * @param rolId
	 * @return
	 */
	public static String obtenerRolesPorId(Integer rolId){
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		String rolStr = null;
		try{
			String query = "SELECT * FROM cat_roles where id = " + rolId;
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			rolStr = "";
			while (resultSet.next()) {
				rolStr = resultSet.getString("nombre");
			}
		}catch (Exception e) {
			e.printStackTrace();
			rolStr=null;
		}finally{
			if(resultSet!=null){
				try{
					resultSet.close();
					resultSet = null;
				}catch (Exception e) {}
			}
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		
		return rolStr;
	}

	
	/**
	 * Eliminar usuario logicamente (-1) 
	 */
	public static Boolean eliminarUsuario(String idUsr){
		Connection connection = null;
		Statement statement = null;
		boolean usuarioEliminado = false;
		try{
			String query = "UPDATE usuario SET estatus = '-1' WHERE id = " + val(idUsr);
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			statement.executeUpdate(query);
			usuarioEliminado=true;
			
		}catch (Exception e) {
			e.printStackTrace();
			usuarioEliminado=false;
		}finally{
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		return usuarioEliminado;
	}
	
	/**
	 * Eliminar logicamente (-1) un registro, ya se de analista, cliente, etc. 
	 */
	public static Boolean eliminarRegistro(String idDatosLab){
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		boolean registroEliminado = false;
		try{
			String query = "UPDATE datos_laborales SET id_estatus = '-1' WHERE id = " + val(idDatosLab);
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			statement.executeUpdate(query);
			
			//Buscar los registros de la tabla usuarios que pertenezcan a este registro.
			query = "SELECT id FROM usuario WHERE id_datos_laborales = " + val(idDatosLab);
			resultSet = statement.executeQuery(query);
			
			List<String> listIdUsuarios = new ArrayList<String>();
			while (resultSet.next()) {
				listIdUsuarios.add(resultSet.getString("id"));
			}
			for(String idUsr : listIdUsuarios){
				eliminarUsuario(idUsr);
			}
			registroEliminado=true;
			
		}catch (Exception e) {
			e.printStackTrace();
			registroEliminado=false;
		}
		return registroEliminado;
	}
	
	/**
	 * Metodo que recibe un cliente y obtiene todos los usuarios relacionados para generar una lista de correos.
	 * 
	 * @param usrVO
	 * @return
	 */
	public static List<EnviarCorreoVO> dameListaCorreos(UsuarioVO usrVO){
		List<EnviarCorreoVO> lstCorreos = new ArrayList<EnviarCorreoVO>();
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try{
			String query = "SELECT * FROM usuario usr WHERE usr.id_datos_laborales = " + val(usrVO.getIdLaborales());
			connection = ConnectionManager.obtenerConexionJDBC();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(query);
			/* obtenemos el registro de la tabla usuario */
			EnviarCorreoVO clienteCorreo = new EnviarCorreoVO();
			clienteCorreo.setEnviar(true);
			clienteCorreo.setCorreoUsuario(usrVO.getCorreo());
			clienteCorreo.setNomUsuario(usrVO.getNomApellido());
			lstCorreos.add(clienteCorreo);
			while (resultSet.next()) {
				String correo = resultSet.getString("correo_usuario");
				if(correo != null && !"".equals(correo)){
					EnviarCorreoVO envioMail = new EnviarCorreoVO();
					envioMail.setNomUsuario(resultSet.getString("usuario"));
					envioMail.setCorreoUsuario(correo != null ? correo.toLowerCase() : null);
					lstCorreos.add(envioMail);
				}
			}
			
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(statement!=null){
				try{
					statement.close();
					statement = null;
				}catch (Exception e) {}
			}
			if(connection!=null){
				try{
					connection.close();
					connection = null;
				}catch (Exception e) {}
			}
		}
		
		
		return lstCorreos;
	}
	
}
